package com.bicap.cloud.nettyserver.config;

import java.nio.channels.SocketChannel;
import java.util.concurrent.TimeUnit;

import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.codec.LengthFieldPrepender;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.handler.timeout.IdleStateHandler;

/***
 * 这里的事件处理类经常会被用来处理一个最近的已经接收的Channel。 ChannelInitializer是一个特殊的处理类，
 * 他的目的是帮助使用者配置一个新的Channel。
 * 也许你想通过增加一些处理类比如NettyServerHandler来配置一个新的Channel
 * 或者其对应的ChannelPipeline来实现你的网络程序。 当你的程序变的复杂时，可能你会增加更多的处理类到pipline上，
 * 然后提取这些匿名类到最顶层的类上。
 */
public class NettyServerInitializer extends ChannelInitializer<Channel>{

	private ServerDataHandler dataHandler;

	public NettyServerInitializer(ServerDataHandler dataHandler) {
		this.dataHandler = dataHandler;
	}

	@Override
	protected void initChannel(Channel ch) throws Exception {
		
		ChannelPipeline pipeline = ch.pipeline();
		//处理心跳
		pipeline.addLast(new IdleStateHandler(62, 0, 0, TimeUnit.SECONDS));
		pipeline.addLast(new AcceptorIdleStateTrigger());
		//pipeline.addLast(new LengthFieldBasedFrameDecoder(65535, 0, 4, 0, 4));
		//pipeline.addLast(new LengthFieldPrepender(4,false));
//		pipeline.addLast(new DelimiterBasedFrameDecoder(65535, Unpooled.copiedBuffer("\r\n".getBytes())));
		pipeline.addLast(new StringDecoder());
		pipeline.addLast(new StringEncoder());
		pipeline.addLast(new ServerHeartBeatHandler());
		pipeline.addLast(dataHandler);

	}

	

}
